#ifndef __AWP1921_H__
#define __AWP1921_H__

#include "hal.h"
#include "acm32f42x_coreboard.h"


#define AWP1921_DEV_ADDRESS  0x88  /* AWP1921 8bit i2c addr */

#define AWP1921_REG_ADDR_00  0x00
#define AWP1921_REG_ADDR_01  0x01
#define AWP1921_REG_ADDR_02  0x02
#define AWP1921_REG_ADDR_03  0x03
#define AWP1921_REG_ADDR_04  0x04
#define AWP1921_REG_ADDR_05  0x05
#define AWP1921_REG_ADDR_06  0x06
#define AWP1921_REG_ADDR_07  0x07
#define AWP1921_REG_ADDR_08  0x08
#define AWP1921_REG_ADDR_09  0x09
#define AWP1921_REG_ADDR_0A  0x0a
#define AWP1921_REG_ADDR_0B  0x0b
#define AWP1921_REG_ADDR_0C  0x0c
#define AWP1921_REG_ADDR_0D  0x0d
#define AWP1921_REG_ADDR_0E  0x0e
#define AWP1921_REG_ADDR_0F  0x0f
#define AWP1921_REG_ADDR_10  0x10
#define AWP1921_REG_ADDR_11  0x11
#define AWP1921_REG_ADDR_12  0x12
#define AWP1921_REG_ADDR_13  0x13
#define AWP1921_REG_ADDR_14  0x14
#define AWP1921_REG_ADDR_15  0x15
#define AWP1921_REG_ADDR_16  0x16
#define AWP1921_REG_ADDR_17  0x17
#define AWP1921_REG_ADDR_18  0x18
#define AWP1921_REG_ADDR_19  0x19
#define AWP1921_REG_ADDR_1A  0x1a


#define AWP1921_TRUE 0x01
#define AWP1921_FALSE 0x00
#define AWP1921_SRAM_BUFFER_LEN 2048 /* 2048个字节， 1024个半字 */

#define AWP1921_AMPLITUDE_59400_MV  59400
#define AWP1921_DAC_SAMPLE_RATA_9US  0x0009

#define AWP1921_SLICE_NUMBER_0 0x0000
#define AWP1921_SLICE_NUMBER_1 0x0001
#define AWP1921_SLICE_NUMBER_2 0x0002

#define AWP1921_ADC_DERETCT_MODE 0x0000
#define AWP1921_ADC_INPUT_MODE 0x0001
#define AWP1921_ADC_AUTO_MODE 0x0003

#define AWP1921_ADC_AVERAGE_TIME_0 0x0000 //  input
#define AWP1921_ADC_AVERAGE_TIME_1 0x0001 //  1/2 * input + 1/2 *average
#define AWP1921_ADC_AVERAGE_TIME_2 0x0002 //  1/4 * input + 3/4 *average


#define AWP1921_ADC_OVV_0512_TIMES 0x0009 //连续512次超过(或低于)ADC 的上阈值(或下阈值)
#define AWP1921_ADC_OVV_1023_TIMES 0x000f //连续1023次超过(或低于)ADC 的上阈值(或下阈值)

#define AWP1921_ADC_THRESHOLD_HIGH_3V 0x0841 // +3V 上阈值电压
#define AWP1921_ADC_THRESHOLD_HIGH_1V 0x0816 //+1V 上阈值电压
#define AWP1921_ADC_THRESHOLD_LOW_3V 0x07fa //-3V下阈值电压

#define AWP1921_LOOP_01_TIME  0x0001 //循环播放一次
#define AWP1921_LOOP_03_TIME  0x0003 //循环播放三次
#define AWP1921_LOOP_10_TIME  0x0010 //循环播放0x10次
#define AWP1921_LOOP_30_TIME  0x0030 //循环播放0x30次
#define AWP1921_LOOP_60_TIME  0x0060 //循环播放0x60次
#define AWP1921_LOOP_90_TIME  0x0090 //循环播放0x60次




#define AWP1921_ENDLESS_ENABLE  0x0001 //一直循环播放
#define AWP1921_ENDLESS_DISABLE 0x0000 //不循环播放

#define AWP1921_ADC_EVENT_ENABLE 0x0001
#define AWP1921_ADC_EVENT_DISABLE 0x0000


#define AWP1921_ADC_CALIBE_ENABLE 0x01
#define AWP1921_ADC_CALIBE_DISABLE 0x00


#define AWP1921_ENABLE_SENSE_PLAY 0x01  //使能Sense按压播放slice1波形
#define AWP1921_SENSE_STOP_PLAY 0x00  //sensor 播放波形关闭


typedef unsigned char AWP1921_BOOL;


typedef enum
{
    AWP1921_ADC_GAIN_FULL_SCALE_95V = 0x00, //95V 量程进行量化
    AWP1921_ADC_GAIN_FULL_SCALE_19V = 0x01, //19V 量程进行量化
} AWP1921_ADC_Gain_Full_Scale;

typedef enum
{
    AWP1921_ADC_OUT_POSITIVE_POLARITY = 0x00, //ADC使用OUT+进行量化
    AWP1921_ADC_OUT_NEGATIVE_POLARITY = 0x01, // ADC使用OUT-进行量化
} AWP1921_ADC_Sample_Polarity;


typedef enum
{
    //ADC Over H事件使能标志位： ADC 值在连续超过上阈值 ADC ovv time 次后，触发该事件
    AWP1921_ADC_OVER_H_EN       = 0x01,
    //ADC Over L事件使能标志位: ADC 值在连续低于下阈值 ADC ovv time 次后，触发该事件
    AWP1921_ADC_OVER_L_EN    = 0x02,
    //ADC Over H posedge事件使能标志位: ADC 前一次状态未在 ADC Over H 中，触发 ADC Over H 事件则触发该事件
    AWP1921_ADC_OVER_H_POSEDEGE_EN     = 0x03,
    /*ADC Over H negedge事件使能标志位: ADC 前一次状态处于 ADC Over H,
      ADC 值在连续低于上阈值ADC ovv time 次后，ADC 状态退出 ADC Over H，触发该事件*/
    AWP1921_ADC_OVER_H_NEGEDGE_EN  = 0x04,
    //ADC OverL posedge事件使能标志位:ADC 前一次状态未在 ADC OverL 中，触发 ADC OverL 事件，则触发该事件
    AWP1921_ADC_OVER_L_POSEDEGE_EN  = 0x05,
    /*ADC OverLnegedge事件使能标志位:ADC 前一次状态处于 ADC OverL,
      ADC 值在连续超过 ADCThresholdL 值 ADC ovv time 次后，ADC 状态退出 ADC OverL，触发该事件*/
    AWP1921_ADC_OVER_L_NEGEDGE_EN  = 0x06,
} AWP1921_ADC_Event_Type;

typedef enum
{
    AWP1921_DIRECT_PLAY = 0x00,  /* direct播放*/
    AWP1921_FIFO_PLAY = 0x01,    /* fifo播放 */
    AWP1921_SRAM_PLAY = 0x02,    /* SRAM播放 */
    AWP1921_ADC_EVENT_TRIGGER_PLAY = 0x04,
    AWP1921_SENSE_PLAY = AWP1921_ADC_EVENT_TRIGGER_PLAY,  /*ADC 事件触发sense 播放*/
} AWP1921_Play_Type;


typedef enum
{
    AWP1921_SRAM_LONG_PLAY = 0x01, //长震 表示振动0x90次
    AWP1921_SRAM_MIDIUM_PLAY = 0x02, //中震 表示振动0x60次
    AWP1921_SRAM_SHORT_PLAY = 0x03, //短震 表示振动0x30次
    AWP1921_SRAM_NO_PLAY = 0x04, //不振动
} AWP1921_SRAM_Play_Type;



typedef struct
{
    AWP1921_ADC_Gain_Full_Scale adcGainScale;
    AWP1921_ADC_Sample_Polarity adcPol;
    AWP1921_BOOL adcCalibeEnable;
    uint16_t amplitude_MV;
    uint16_t dacSampleRate;
} AWP1921_Common_Confg;


typedef struct
{
    uint16_t waveNumber; //slice 编号
    uint16_t startAddr; /* SRAM波形起始地址*/
    uint16_t waveLen;  /* 波形的长度 */
    uint16_t loopTime; //播放次数
    uint16_t endless; //为1 表示一直播放，为0采用上面播放次数进行播放
    AWP1921_Play_Type playType;
    const uint16_t *wavebuf;
} AWP1921_Wave_Config;



typedef struct
{
    uint16_t waveNumber; //slice 编号
    AWP1921_ADC_Event_Type eventType; //使能ADC触发波形播放事件类型，
} AWP1921_Sense_Play_Config;


typedef struct
{
    uint16_t adcMode; //adc模式存在 direct 模式、INPT 模式、Auto 模式
    uint16_t adcAverageTime; //配置 ADC 滑动平均的系数
    uint16_t adcOvvTime; //连续多少次超过(或低于)ADC 的上阈值(或下阈值)，进入(或退出) ADC 事件，相当于滤波的作用
    uint16_t adcThresholdHigh; //ADC 的上阈值
    uint16_t adcThresholdLow; //ADC 的下阈值
    AWP1921_Sense_Play_Config senseCfg[6]; //6种不同的ADC采样 sense播放配置
} AWP1921_ADC_Config;


extern I2C_HandleTypeDef I2C_Handle;

void AWP1921_I2C_Write_REG(uint8_t regAddr, uint16_t regVal);
void AWP1921_I2C_Read_REG(uint8_t regAddr, uint16_t *regVal);
void AWP1921_I2C_Write_Date(uint8_t regAddr, uint8_t *data, uint16_t dataLen);

void AWP1921_Init(void);

void AWP1921_Sense_EnablePlay_Or_Stop(AWP1921_BOOL enblePlay);
void AWP1921_SRAM_Play_Or_Stop(AWP1921_SRAM_Play_Type sramPlayType);



uint16_t AWP1921_Read_ADC_Date(void);

uint16_t AWP1921_Read_Status(void);



#endif

